OC 30 day
new實際上是一個類方法。
new 方法的作用:
alloc方法是一個類方法
作用: 那一個類調用這個方法,就創建那個類的對象,並把對象返回。
作用:初始化對象,為對象的屬性賦初始值,這個init方法我們叫做構造方法。
init方法做的事情:初始化對象。
為對象的屬性賦默認值。
如果屬性的類型是基本數據類型就賦值為0
c指針 NULL
OC指針 nil
所以,我們創建一個對象如果沒有為這個對象的屬性賦值,這個對象的屬性是有默認值的。
所以,我們每次新創建一個對象,這個對象的屬性都被初始化了。
應該是先使用 alloc創建一個對象,然後再使用init初始化這個對象,才可以使用這個對象。
雖然沒有初始化的對象有的時候也可以使用,但是千萬不要這麼做。
使用一個未經初始化的對象是極其危險的。
alloc 相當於申請內存空間,init 再初始化對象。
Person *p1 = [Person new];
完全等價於
Person *p1 = [[Person alloc]init];
而是我們自定義的。
那麼這個時候,我們就可以重寫init方法。在這個方法。在這個方法中按照我們自己的想法為對象的屬性賦值。
重寫init方法的規範:
為什麼要調用父類init的方法?
因為父類的init方法,會初始化父類的屬性,所以必須要保證當前對象中的父類屬性也同時被初始化。
為什麼要賦值給self?
因為,調用父類的init方法,會返回初始化成功對象。實際上返回的就是當前對象。但是我們要判斷是否初始化成功。
重寫init 方法:
- (instancetype)init{
if(self = [super init]){
//初始化當前屬性的代碼;
}
return self;
}
如果你希望創建出來對象的屬性的默認值不是nil NULL 0 而是我們指定的值。那麼這個我們就可以重寫init方法。
我希望創建對象的時候,對象的屬性值由創建對象的人來指定,而不是寫死在init方法中。
-(instancetype)initWithName:(NSString *)name andAge:(int)age{
if(self = [super init]){
self.name = name;
self.age = age;
}
return self;
}
在你需要初始化同時賦值。